Estoy usando la biblioteca 'csv-parser'. Usando el método a continuación, puedo obtener los datos almacenados en la matriz de cumpleaños que se muestra en la consola:
const birthdays = []; fs.createReadStream('./data/groupes.csv') .pipe(csv({})) .on('data', (data) => birthdays.push(data)) .on('end', () => { console.log(birthdays) }); pero cuando inicio sesión fuera de .on('end') como se muestra a continuación, la consola muestra la matriz de cumpleaños como vacía:
const birthdays = []; fs.createReadStream('./data/groupes.csv') .pipe(csv({})) .on('data', (data) => birthdays.push(data)) .on('end', () => { }); console.log(birthdays)¿Porqué es eso? y como puedo solucionarlo? Gracias por adelantado.
¿Porqué es eso?
Es porque createReadStream funciona de forma asíncrona y cuando console.log(birthdays); afuera, la ejecución del código lee el registro antes de que createReadStream haya terminado de procesarse
¿Cómo puedo resolverlo?
Hiciste bien en ponerlo dentro de .on("end")
const birthdays = []; fs.createReadStream('./data/groupes.csv') .pipe(csv({})) .on('data', (data) => birthdays.push(data)) .on('end', () => { console.log(birthdays); // further processing with birthdays });¿Podrías hacer algo como esto?
const csv = require("csv-parser"); const fs = require("fs"); const path = require("path"); const { promisify } = require("util"); const readFile = promisify(fs.readFile); const birthdays = []; const filePath = path.join(__dirname, "data", "groupes.csv"); readFile(filePath, "utf8").then((data) => { csv(data, { separator: ",", }) .on("data", (row) => { birthdays.push(row); }) .on("end", () => { console.log(birthdays); }); });